﻿// 4552. 免费馅饼.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>
#include <algorithm>


using namespace std;
/*
https://www.acwing.com/problem/content/4555/


都说天上不会掉馅饼，但有一天 gameboy 正走在回家的小径上，忽然天上掉下大把大把的馅饼。

说来 gameboy 的人品实在是太好了，这馅饼别处都不掉，就掉落在他身旁的 10 米范围内。

馅饼如果掉在了地上当然就不能吃了，所以 gameboy 马上卸下身上的背包去接。

但由于小径两侧都不能站人，所以他只能在小径上接。

由于 gameboy 平时老呆在房间里玩游戏，虽然在游戏中是个身手敏捷的高手，但在现实中运动神经特别迟钝，每秒种只有在移动不超过一米的范围内接住坠落的馅饼。

现在给这条小径如图标上坐标：

1176_1.jpg

为了使问题简化，假设在接下来的一段时间里，馅饼都掉落在 0∼10 这 11 个位置。

开始时 gameboy 站在 5 这个位置，因此在第一秒，他只能接到 4,5,6 这三个位置中其中一个位置上的馅饼。

问 gameboy 最多可能接到多少个馅饼？（假设他的背包可以容纳无穷多个馅饼）

输入格式
输入数据有多组。

每组数据的第一行为正整数 n，表示有 n个馅饼掉在这条小径上。

在接下来的 n 行中，每行有两个整数 x,T
，表示在第 T 秒有一个馅饼掉在 x 点上。

同一秒钟在同一点上可能掉下多个馅饼。

n=0 时输入结束。

输出格式
每一组输入数据对应一行输出。

输出一个整数 m，表示 gameboy 最多可能接到 m 个馅饼。

数据范围
输入最多包含 10 组数据。
1≤n≤105
,
0≤x≤10
,
1≤T≤105。

输入样例：

输出样例：
4
*/

const int N = 100010;
const int M = 15;
int dp[N][M];	//第n秒人在M的位置能得到的最大苹果数
int apple[N][M];	//第N秒M落下的苹果数
int n;
int costtime;

void solve() {
	int ans = 0;
	for (int i = 1; i <= costtime; i++) {
		for (int j = 1; j <= 11; j++) {
			dp[i][j] = dp[i - 1][j] + apple[i][j];	//原地不动 ，就是上一秒的苹果数加上这一秒J坐标落下的苹果数
			dp[i][j] = max(dp[i][j], max(dp[i-1][j-1],dp[i-1][j+1])+apple[i][j]); //从上一秒旁边两个位置移动到j 就是上一秒旁边的苹果数加上这一秒J坐标落下的苹果数

			if (i == costtime) {
				ans = max(ans, dp[i][j]);
			}
		}
	}

	cout << ans << endl;
}

int main()
{
	while (cin >> n) {
		if (n == 0) { break; }
		costtime = -1;
		memset(dp, -0x3f, sizeof dp);
		dp[0][5+1] = 0;	//起始位置 坐标都偏移一下 1~11 方便写代码
		memset(apple,0,sizeof apple);
		for (int i = 1; i <= n; i++) {
			int pos, time;
			cin >> pos >> time;
			costtime = max(costtime, time);	//得到最后一个落下苹果的时间
			apple[time][pos+1]++;
		}

		solve();
	}


	return 0;
}
 